package com.bwie.dateVo;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 * @projectName: day0711
 * @package: com.bwie.dateVo
 * @className: OrderNoGenerator
 * @author: 杨珂
 * @description: TODO
 * @date: 2025/7/11 20:52
 * @version: 1.0
 */
@Component
public class OrderNoGenerator {
    private final StringRedisTemplate redisTemplate;

    // 日期格式器：yyMMdd
    private static final DateTimeFormatter DF_YYMMDD = DateTimeFormatter.ofPattern("yyMMdd");

    public OrderNoGenerator(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 生成 19 位订单号
     */
    public String nextNo() {
        // 1. 前 6 位：yyMMdd
        String ymd = LocalDate.now().format(DF_YYMMDD);

        // 2. 后 13 位：利用 Redis INCR 自增
        String key = "order:incr:" + ymd;
        Long seq = redisTemplate.opsForValue().increment(key);

        // 首次自增后设置过期时间，防止 key 一直膨胀
        if (seq != null && seq == 1) {
            // 设置 48 小时过期，留冗余
            redisTemplate.expire(key, Duration.ofHours(48));
        }

        // 3. 组合成 19 位
        return ymd + String.format("%013d", seq);
    }
}
